package com.bugstack.springframework.beans.factory.support;

import com.bugstack.springframework.beans.BeansException;
import com.bugstack.springframework.beans.factory.config.BeanDefinition;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;


/**
 * JDK 实例化，这段代码通过反射机制，根据传入的 BeanDefinition、构造函数及参数，来态动地实例化一个对象。
 */
public class SimpleInstantiationStrategy implements InstantiationStrategy{
    @Override
    public Object instantiate(BeanDefinition beanDefinition, String beanName, Constructor ctor, Object[] args) {
        Class beanClass = beanDefinition.getBeanClass();

        try{
            if(ctor != null){
                //这一行的作用是通过传入构造函数的参数类型来获取与之匹配的构造函数。（反射获取无参构造函数）
                return beanClass.getDeclaredConstructor(ctor.getParameterTypes()).newInstance(args);//getDeclaredConstructor 方法根据参数类型获取 beanClass 的特定构造函数，并创建该构造函数的新实例。
            }else{
                return beanClass.getDeclaredConstructor().newInstance();//获取无参构造函数，并创建该构造函数的新实例（反射获取有参构造函数）
            }
        }catch (NoSuchMethodException | InstantiationException |IllegalAccessException | InvocationTargetException e){
            throw new BeansException("Failed to instantiate [" + beanClass.getName() + "]", e);

        }

    }
}
